/**
 * 检测元素所属类型
 * @param {any} ele 要检测的元素
 * Object.prototype.toString.call(*)的可能结果如下所示：
 * @example null             [object Null]
 * @example undefined        [object Undefined]
 * @example Symbol());       [object Symbol]
 * @example true             [object Boolean]
 * @example ''               [object String]
 * @example 1                [object Number]
 * @example []               [object Array]
 * @example {}               [object Object]
 * @example new Date()       [object Date]
 * @example new Function()   [object Function]
 * @example new RegExp()     [object RegExp]
 * @example new Error()      [object Error]
 * @example document         [object HTMLDocument]
 * @example window           [object global] window 是全局对象 global 的引用
 * @param {*} ele 待检测的对象、字符串、数组等
 * @returns {String} 元素类型（string、number、boolean、symbol、undefined、null、function、date、array、object、regexp、error、htmldocument、global）
 */
export const typeOf = (ele) => {
  const endStr = Object.prototype.toString.call(ele);
  return endStr.split(" ")[1].slice(0, -1);
};

/**
 * 展示message提示信息，默认展示成功通知
 * @param hint string, MessageParams 提示内容
 */
export function showMessage(hint, type = "success") {
  if (!hint) return;
  if (typeof hint === "string") {
    const speed = 7; // 速度：7字/秒
    let duration = (hint.length / speed) * 1000;
    if (duration < 1500) {
      duration = 1500;
    }
    this.$message({
      message: hint,
      type,
      duration,
      grouping: true,
      showClose: duration > 2000,
    });
  } else {
    this.$message(hint);
  }
}

/**
 * 对象数组排序（默认order）
 * @param {CommonObj[]} arr 要排序的数组
 * @param {string} key  排序依据的对象属性键名
 * @param {asc | desc | random} type 排序方式 asc 升序 desc 降序 random 随机
 */
export function sortObjArrByKey(arr = [], key = "order", type = "asc") {
  arr.sort((a, b) => {
    if (type === "asc") return a[key] - b[key];
    if (type === "desc") return b[key] - a[key];
    if (type === "random") return Math.random() - 0.5;
    throw new Error(`传参类型错误：${type}`);
  });
  return arr;
}

/**
 * 判断是否是虚拟DOM
 * @param {any} node
 * @returns
 */
export function isVNode(node) {
  return (
    typeof node === "object" &&
    node.hasOwnProperty("elm") &&
    node.hasOwnProperty("data")
  );
}
